iddomicilioorden direccion localidad iniciohorario1
Min. : 74956 Length:27382 Length:27382 Min. : 0
1st Qu.: 77460 Class :character Class :character 1st Qu.:901
Median : 82348 Mode :character Mode :character Median :901
Mean :101622 Mean :901
3rd Qu.:121664 3rd Qu.:901
Max. :183277 Max. :901
finhorario1 latitud longitud cliente mes
Min. :1400 Min. :-34.85 Min. :-58.73 20:16510 Min. :5.000
1st Qu.:1401 1st Qu.:-34.62 1st Qu.:-58.48 70:10872 1st Qu.:5.000
Median :1401 Median :-34.60 Median :-58.44 Median :6.000
Mean :1401 Mean :-34.60 Mean :-58.44 Mean :6.021
3rd Qu.:1401 3rd Qu.:-34.58 3rd Qu.:-58.40 3rd Qu.:7.000
Max. :2359 Max. :-34.39 Max. :-58.15 Max. :7.000
bultos peso unidades iniciovisitaplanificado
Min. : 0.100 Min. : 0.00 Min. : 1.00 Length:27382
1st Qu.: 2.000 1st Qu.: 13.00 1st Qu.: 2.00 Class :character
Median : 3.000 Median : 20.94 Median : 6.00 Mode :character
Mean : 5.692 Mean : 40.95 Mean : 28.37
3rd Qu.: 6.000 3rd Qu.: 39.00 3rd Qu.: 40.00
Max. :360.000 Max. :2475.00 Max. :2203.00
finvisitaplanificado iniciovisitareal finvisitareal
Length:27382 Length:27382 Length:27382
Class :character Class :character Class :character
Mode :character Mode :character Mode :character
inicio
Min. :2024-05-03 07:17:51.00
1st Qu.:2024-05-24 15:38:00.00
Median :2024-06-18 10:34:53.00
Mean :2024-06-17 22:15:43.75
3rd Qu.:2024-07-11 11:21:32.00
Max. :2024-08-06 16:57:00.00
Calculamos el tiempo promedio de demora en la salida, y en la llegada
calcular_tiempo_formateado <-function(inicio, fin) {# Calcula la diferencia en minutos con decimales tiempo_minutos_dec <-as.numeric(difftime(fin, inicio, units ="mins"))# Convierte el resultado a minutos enteros, ignorando los segundos tiempo_minutos <-floor(tiempo_minutos_dec)# Retorna el valor numéricoreturn(tiempo_minutos)}# Aplicar la función en el data frame sin crear columnas adicionalesdf_clean <- df_clean %>%mutate(DemoraSalida =calcular_tiempo_formateado(iniciovisitaplanificado, iniciovisitareal))%>%mutate(DemoraLlegada =calcular_tiempo_formateado(finvisitaplanificado, finvisitareal))promedio_demora_salida <-mean(df_clean$DemoraSalida,na.rm =TRUE)promedio_demora_salida
ggplot(df_demora_por_localidad,aes(x=localidad,y=demora_llegada_localidad))+geom_bar(stat="identity")+labs(title ="Demora de Salida por Localidad",x ="Localidad",y ="Demora de Salida (promedio)") +theme(axis.text.x =element_text(angle =45, hjust =1))
Ahora calculamos la demora promedio por cliente
demora_promedio_por_cliente <- df_clean%>%group_by(cliente) %>%summarise(demora_salida_cliente=mean(DemoraSalida,na.rm=T),demora_llegada_cliente=mean(DemoraLlegada,na.rm=T))demora_melt <- reshape2::melt(demora_promedio_por_cliente, id.vars ='cliente')# Crear el gráfico con ggplot2ggplot(demora_melt, aes(x =factor(cliente), y = value, fill = variable)) +geom_bar(stat ='identity', position ='dodge') +labs(x ='Cliente', y ='Demora', fill ='Tipo de demora') +theme_minimal()
Distribución de las entregas en un mapa
library(dplyr)library(sf)library(plotly)
Attaching package: 'plotly'
The following object is masked from 'package:MASS':
select
The following object is masked from 'package:ggmap':
wind
The following object is masked from 'package:ggplot2':
last_plot
The following object is masked from 'package:stats':
filter
The following object is masked from 'package:graphics':
layout
Sys.setenv("MAPBOX_TOKEN"="pk.eyJ1IjoiYWd1c3Rpbm9ydWUiLCJhIjoiY20yamR1dmlhMDRnMjJscHgxZTk4a3Z1OSJ9.3XpQh1Kfpitza34209j9vA")df.sf <- df %>%filter(!is.na(longitud) &!is.na(latitud)) %>%filter(longitud <0) %>%filter(latitud <-34.0) %>%st_as_sf(coords =c("longitud", "latitud"), crs =4326)coords <-st_coordinates(df.sf)plot_ly() %>%add_trace(type ='scattermapbox',mode ='markers',lon = coords[, 1], # Longitudlat = coords[, 2], # Latitudmarker =list(size =8, color ='blue') # Tamaño y color de los puntos ) %>%layout(mapbox =list(style ='streets', zoom =8, # Ajusta el nivel de zoom según tu preferenciacenter =list(lon =mean(coords[, 1]), lat =mean(coords[, 2])) ),showlegend =FALSE# Ocultar leyenda si no es necesaria ) %>%config(mapboxAccessToken =Sys.getenv("MAPBOX_TOKEN"))
Distribucion de las entregas de los distintos clientes
library(dplyr)library(sf)library(plotly)# Configurar el token de MapboxSys.setenv("MAPBOX_TOKEN"="pk.eyJ1IjoiYWd1c3Rpbm9ydWUiLCJhIjoiY20yamR1dmlhMDRnMjJscHgxZTk4a3Z1OSJ9.3XpQh1Kfpitza34209j9vA")# Filtrar y convertir los datos a objeto sfdf.sf <- df %>%filter(!is.na(longitud) &!is.na(latitud)) %>%filter(longitud <0) %>%filter(latitud <-34.0) %>%st_as_sf(coords =c("longitud", "latitud"), crs =4326)# Extraer las coordenadascoords <-st_coordinates(df.sf)# Asignar etiquetas para la leyendadf.sf$label <-case_when( df.sf$cliente ==20~'Cliente 20', # Etiqueta para cliente 20 df.sf$cliente ==70~'Cliente 70', # Etiqueta para cliente 70TRUE~'Otros Clientes'# Otros clientes)# Asignar colores basados en la etiquetadf.sf$color <-case_when( df.sf$cliente ==20~'purple', # Color violeta para cliente 20 df.sf$cliente ==70~'yellow', # Color amarillo para cliente 70TRUE~'black'# Color negro para los demás)# Crear el gráfico con leyenda y colores personalizadosplot_ly() %>%add_trace(type ='scattermapbox',mode ='markers',lon = coords[, 1], # Longitudlat = coords[, 2], # Latitudtext = df.sf$cliente, # Mostrar el cliente al pasar el mousemarker =list(size =8,color = df.sf$color # Color personalizado ),showlegend =TRUE,name = df.sf$label # Asignar la etiqueta para la leyenda ) %>%layout(mapbox =list(style ='streets',zoom =8, # Ajustar nivel de zoomcenter =list(lon =mean(coords[, 1]), lat =mean(coords[, 2])) # Centrar en las coordenadas promedio ),showlegend =TRUE# Mostrar la leyenda ) %>%config(mapboxAccessToken =Sys.getenv("MAPBOX_TOKEN"))
Peso por unidad
peso_por_unidad <-function(peso, unidades) {if (unidades ==0) {return(NA) # Si las unidades son 0, devolvemos NA para evitar la división por 0 } else {return(peso / unidades) }}df$peso_por_unidad <-mapply(peso_por_unidad, df$Peso, df$Unidades)head(df[c("Peso", "Unidades", "peso_por_unidad")])
ggplot(df, aes(x = peso_por_unidad)) +geom_histogram(binwidth =0.6, fill ="blue", color ="black") +labs(title ="Distribución del Peso por Unidad", x ="Peso por Unidad", y ="Frecuencia")
Cantidad de entregas por mes
# Cargar librerías necesariaslibrary(ggplot2)library(lubridate)# Asegurarse de que la columna InicioVisitaPlanificado esté en formato Datedf$InicioVisitaPlanificado <-as.Date(df$InicioVisitaPlanificado, format ="%Y-%m-%d")df_cantidad_de_entregas_por_dia<-df%>%group_by(InicioVisitaPlanificado)%>%summarise(n=n())%>%mutate(mes =month(InicioVisitaPlanificado))ggplot(df_cantidad_de_entregas_por_dia, aes(x = InicioVisitaPlanificado, y = n, group = mes, color =as.factor(mes))) +geom_line(size =0.8) +# Líneas de cada mesgeom_point(size =1.5) +# Añadir puntos en las líneaslabs(title ="Cantidad de entregas a lo largo del tiempo por mes", x ="Fecha de Inicio de Visita Planificado", y ="Cantidad de entregas",color ="Mes") +# Añadir etiqueta a la leyendatheme_minimal() +theme(panel.grid.major =element_line(color ="gray90"))
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
Cantidad de entregas por cliente en todos los meses
df$InicioVisitaPlanificado <-as.Date(df$InicioVisitaPlanificado, format ="%Y-%m-%d")df$cliente<-as.character(df$cliente)cantidad_entregas_por_cliente<-df%>%group_by(InicioVisitaPlanificado,cliente)%>%summarise(n=n())%>%mutate(mes =month(InicioVisitaPlanificado))cantidad_entregas_por_cliente
ggplot(cantidad_entregas_por_cliente, aes(x =InicioVisitaPlanificado , y = n, color = cliente)) +geom_line(size =1) +geom_point(size =2.5) +labs(title ="Cantidad de productos entregados por cliente cada día", x ="Fecha de Entrega", y ="Cantidad de Productos Entregados",color ="Cliente") +theme_minimal()
Cantidad de entregas por mes
df$mes <-as.factor(df$mes)entregas_por_mes <- df %>%group_by(mes) %>%summarise(cantidad_entregas =n())ggplot(entregas_por_mes, aes(x = mes, y = cantidad_entregas)) +geom_bar(stat ="identity", fill ="blue", color ="black") +labs(title ="Cantidad de Entregas por Mes", x ="Mes", y ="Cantidad de Entregas") +theme_minimal()
Distribución de entregas en los distintos días de la semana
library(plotly)library(dplyr)library(sf)library(lubridate) # Para manejar fechas# Asegurarse de que la columna 'fecha' esté en formato Date (si no lo está ya)df$InicioVisitaPlanificado <-as.Date(df$InicioVisitaPlanificado, format ="%Y-%m-%d")# Agregar una columna con el día de la semana (1 = lunes, 7 = domingo)df <- df %>%mutate(dia_semana =wday(InicioVisitaPlanificado, label =TRUE, abbr =FALSE))# Filtrar y convertir los datos a objeto sf (para las coordenadas)df.sf <- df %>%filter(!is.na(longitud) &!is.na(latitud)) %>%filter(longitud <0) %>%filter(latitud <-34.0) %>%st_as_sf(coords =c("longitud", "latitud"), crs =4326)# Extraer las coordenadascoords <-st_coordinates(df.sf)# Crear un gráfico interactivo de puntos coloreados por día de la semanaplot_ly() %>%add_trace(type ='scattermapbox',mode ='markers',lon = coords[, 1], # Longitudlat = coords[, 2], # Latitudtext =~paste(df.sf$cliente, "<br>", df.sf$dia_semana), # Mostrar cliente y día de la semana al pasar el mousemarker =list(size =8 ),color =~df.sf$dia_semana, # Colorear por día de la semana de forma discretacolors ='Set1'# Usar una paleta de colores discreta como Set1, Set2, etc. ) %>%layout(mapbox =list(style ='streets',zoom =8, # Ajusta el nivel de zoom según tu preferenciacenter =list(lon =mean(coords[, 1]), lat =mean(coords[, 2])) # Centrar en las coordenadas promedio ),showlegend =TRUE# Mostrar la leyenda para identificar los días de la semana ) %>%config(mapboxAccessToken =Sys.getenv("MAPBOX_TOKEN"))
Cluster de Entregas por Localidad
coords <- df_clean %>%select(latitud, longitud) %>%# Ajustar si los nombres son diferentesna.omit() # Eliminar filas con valores faltantesclusters <-kmeans(coords, centers =3)df_clean$cluster <-as.factor(clusters$cluster)ggplot(df_clean, aes(x = longitud, y = latitud, color = cluster)) +# Ajustar nombres si es necesariogeom_point() +labs(title ="Clusters de Entregas por Localidad") +theme_minimal()